package com.web.util;
/*
 * 数据库工具类
 * */

import com.web.util.DataSourceUtils;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class JDBCUtils {

    /*
     * 数据库的增删改
     * @param sql
     * @param args
     * @return
     * */
    public static int update(String sql,Object... args){
        try(Connection connection = DataSourceUtils.getConnection()) {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            for (int i = 0;i < args.length;i++){
                preparedStatement.setObject(i+1,args[i]);
            }
            int rows = preparedStatement.executeUpdate();
            return rows;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static <T> List<T> query(Class<T> clazz,String sql,Object... args){
        try(Connection connection = DataSourceUtils.getConnection()) {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            for (int i = 0;i < args.length;i++){
                preparedStatement.setObject(i+1,args[i]);
            }
            // 创建List集合
            List<T> list = new ArrayList<>();
            // 执行查询操作
            ResultSet rs = preparedStatement.executeQuery();
            // 遍历结果集
            while(rs.next()){
                // 创建对象
                T obj = clazz.newInstance();
                // 获得所有的属性
                Field[] fields = clazz.getDeclaredFields();
                for (Field field: fields){
                    // 通过属性名称读取结果集中的值
                    Object value = rs.getObject(field.getName());
                    // 设置属性访问性
                    field.setAccessible(true);
                    // 设置属性的值
                    field.set(obj,value);
                }
                // 添加到集合
                list.add(obj);
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

